package com.zpself.module.JDK8新功能.lambda;


import org.junit.Test;

/**
 * @author By ZengPeng
 * @Description   几种函数式编程   参考：https://zhuanlan.zhihu.com/p/220706448
 *      Supplier，供给型接口。没有参数，带返回值。 其方法：T get();
 *      Function<T, R>，函数型接口。接收一个参数，返回一个结果。其方法：R apply(T t);
 *      Predicate，断言型接口。接收一个参数，返回boolean值。其方法：boolean test(T t);
 *      Consumer，消费型接口。接收一个参数，没有返回值。其方法有：void accept(T t);
 * @date in  2021/3/1 16:15
 * @Modified By
 */
public class TestLambda {

    //----------1.v，供给型接口。没有参数，带返回值。 其方法：T get();----------
    private Object supplierMethod(供给型接口 supplier){
        return supplier.test();
    }
    @Test
    public void tesSupplier(){                    //实现接口      参数         方法体
        System.out.println("供给型接口执行结果："+supplierMethod(() -> {return "提供一个国家分配的对象：Object";}));
    }



    //----------2. Function<T, R>，函数型接口。接收一个参数，返回一个结果。其方法：R apply(T t);----------
    private Object functionMethod(函数型接口 function){
        return function.test(1,2);
    }
    @Test
    public void tesFunction(){                    //实现接口      参数         方法体
        System.out.println("相加函数执行结果："+functionMethod((x,y) -> {return x+y;}));
    }





    //----------3.Predicate，断言型接口。接收一个参数，返回boolean值。其方法：boolean test(T t)----------
    private Boolean predicateMethod(断言型接口 predicate){
        return  predicate.test(2);
    }
    @Test
    public void testPredicate(){            //参数         方法体
        System.out.println(predicateMethod(number -> { return number > 1;}));
    }





    //----------4. Consumer，消费型接口。接收一个参数，没有返回值。其方法有：void accept(T t);----------
    private void consumerMethod(消费型 consumer){
        consumer.test("一个苹果");
    }
    @Test
    public void testConsumer(){   //实现接口  参数         方法体
        consumerMethod(number -> System.out.println("我消费了："+number));
        //首先，方法体只有一行代码。其次，方法的实现已经存在。
        // 此时，就可以用方法引用替换 lambda 表达式。
        consumerMethod(System.out::println);
    }

}
